CREATE OR REPLACE PACKAGE        PKG_TARGPS AS 

  /* TODO enter package declarations (types, exceptions, methods etc) here */ 
  PROCEDURE PR_REUBICAR_TABLA_EXT(
                              IN_NOMBRE_TABLA_EXT IN VARCHAR2,
                              IN_NOMBRE_ARCHIVO IN VARCHAR2,
                              OUT_SALIDA OUT NUMBER);
                              
  PROCEDURE PR_PROCESAR_ARCHIVO(IN_CODIDO_PROCESO IN NUMBER,
                                IN_TIPO_ARCHIVO IN NUMBER,
                                IN_FECHA_PROCESO IN VARCHAR2,
                                IN_NOMBRE_ARCHIVO IN VARCHAR2,
                                IN_TURNO IN VARCHAR2,
                                OUT_RETORNO OUT NUMBER,
                                OUT_MENSAJE OUT VARCHAR2);
    PROCEDURE PR_ACTUALIZAR_PROCESO(IN_PROCESO IN NUMBER,
                                  IN_ESTADO IN VARCHAR2);
  
  PROCEDURE PR_CARGAR_TARJETAS;
  
  PROCEDURE PR_ACTUALIZAR_TARJ_SOLI(IN_ST_TARJETA VARCHAR2);
  
  PROCEDURE PR_ACTUALIZAR_TARJ_RETO(IN_ST_TARJETA VARCHAR2);
  
  PROCEDURE PR_ARCHIVO_SOLICITADOS(IN_CODIDO_PROCESO IN NUMBER,
                                   IN_FECHA_PROCESO IN VARCHAR2,
                                   IN_NOMBRE_ARCHIVO IN VARCHAR2,
                                   OUT_RETORNO OUT NUMBER,
                                   OUT_MENSAJE OUT VARCHAR2);
                                   
  PROCEDURE PR_ARCHIVO_RETORNADOS(IN_CODIDO_PROCESO IN NUMBER,
                                   IN_FECHA_PROCESO IN VARCHAR2,
                                   IN_NOMBRE_ARCHIVO IN VARCHAR2,
                                   IN_TURNO IN VARCHAR2,
                                   OUT_RETORNO OUT NUMBER,
                                   OUT_MENSAJE OUT VARCHAR2);                                   
  
  PROCEDURE PR_ARCHIVO_FALTANTES(IN_CODIDO_PROCESO IN NUMBER,
                                   IN_FECHA_PROCESO IN VARCHAR2,
                                   IN_NOMBRE_ARCHIVO IN VARCHAR2,
                                   IN_TURNO IN VARCHAR2,
                                   OUT_RETORNO OUT NUMBER,
                                   OUT_MENSAJE OUT VARCHAR2);
  
  PROCEDURE PR_LOG_CARGA
  (
    p_IN_IDPROCESO IN NUMBER,
    p_IN_NOMBREARCHIVO IN VARCHAR2,
    p_IN_FILA NUMBER,
    p_COD_IDENTIFICADOR IN VARCHAR2,
    p_MSGERROR IN VARCHAR2,
    p_OUT_RETORNO OUT NUMBER,
    p_OUT_MENSAJE OUT VARCHAR2
  );
  
    PROCEDURE PR_VALIDAR_ENPROCESO(
    PIDAUTORIZA OUT  VARCHAR2
    );
  PROCEDURE PR_CONSOLIDAR_CARGA(idTurno Varchar2, fechaProceso Varchar2, cur_equipos out sys_refcursor);
END PKG_TARGPS;
/


CREATE OR REPLACE PACKAGE BODY PKG_TARGPS AS

  PROCEDURE PR_REUBICAR_TABLA_EXT(
                              IN_NOMBRE_TABLA_EXT IN VARCHAR2,
                              IN_NOMBRE_ARCHIVO IN VARCHAR2,
                              OUT_SALIDA OUT NUMBER)
  IS
    LSQL VARCHAR2(150);
  BEGIN
    OUT_SALIDA:= 1;
    LSQL:=' ALTER TABLE TARGPS.' || UPPER(IN_NOMBRE_TABLA_EXT) ||
                      ' LOCATION ('''||IN_NOMBRE_ARCHIVO||''')';
    EXECUTE IMMEDIATE LSQL;
    EXCEPTION
      WHEN OTHERS THEN
           OUT_SALIDA:= -1;
           RAISE;
  END PR_REUBICAR_TABLA_EXT;
  
  PROCEDURE PR_PROCESAR_ARCHIVO(IN_CODIDO_PROCESO IN NUMBER,
                                IN_TIPO_ARCHIVO IN NUMBER,
                                IN_FECHA_PROCESO IN VARCHAR2,
                                IN_NOMBRE_ARCHIVO IN VARCHAR2,
                                IN_TURNO IN VARCHAR2,
                                OUT_RETORNO OUT NUMBER,
                                OUT_MENSAJE OUT VARCHAR2)
  IS
  BEGIN
  
    IF IN_TIPO_ARCHIVO = '58' THEN --SOLICITADOS
      PR_ARCHIVO_SOLICITADOS(IN_CODIDO_PROCESO,IN_FECHA_PROCESO,IN_NOMBRE_ARCHIVO,OUT_RETORNO,OUT_MENSAJE);
      PR_CARGAR_TARJETAS();
      PR_ACTUALIZAR_PROCESO(IN_CODIDO_PROCESO,'71'); --SOLICITADO
    ELSIF IN_TIPO_ARCHIVO = '59' THEN --Retornados
      PR_ARCHIVO_RETORNADOS(IN_CODIDO_PROCESO,
                            IN_FECHA_PROCESO,
                            IN_NOMBRE_ARCHIVO,
                            IN_TURNO,       
                            OUT_RETORNO,
                            OUT_MENSAJE);
      PR_ACTUALIZAR_TARJ_SOLI('63'); -- Estampado
      PR_ACTUALIZAR_PROCESO(IN_CODIDO_PROCESO,'72'); --ENTREGADO
    ELSIF IN_TIPO_ARCHIVO = '60' THEN --Faltantes
    
      PR_ARCHIVO_FALTANTES(IN_CODIDO_PROCESO,
                           IN_FECHA_PROCESO,
                           IN_NOMBRE_ARCHIVO,
                           IN_TURNO,
                           OUT_RETORNO,
                           OUT_MENSAJE);
      PR_ACTUALIZAR_TARJ_RETO('63'); -- Estampado
      PR_ACTUALIZAR_PROCESO(IN_CODIDO_PROCESO,'73'); --COMPLETO
    END IF;
  
  END PR_PROCESAR_ARCHIVO;
  
  PROCEDURE PR_ACTUALIZAR_PROCESO(IN_PROCESO IN NUMBER,
                                  IN_ESTADO IN VARCHAR2)
  
  IS
  BEGIN
    UPDATE ttargps_proceso_carga PC
      SET pc.cid_esta_fact = IN_ESTADO
      where pc.nid_proceso_carga = IN_PROCESO;
    commit;
    
  END PR_ACTUALIZAR_PROCESO;
  
  PROCEDURE PR_CARGAR_TARJETAS
  
  IS
  BEGIN
    INSERT INTO TARGPS.TTARGPS_TARJETA(
        nid_tarjeta,
        nid_proceso_carga,
        fec_proceso,
        num_tarjeta,
        cod_tarjeta,
        txt_descripcion,
        fec_estampacion,
        cid_turno,
        cid_tamanio,
        cid_tipo_soli,
        cid_tipo_arch,
        cod_oficina,
        cid_tipo_docu,
        cid_num_docu,
        cod_material,
        fec_coordinacion,
        cid_st_tarjeta,
        cid_form_fact,
        cod_usuario_creacion,
        fecha_creacion,
        cid_tecnologia
    ) 
    SELECT 
        targps.SEQ_TTARGPS_TARJETA.nextval ,
        nid_proceso_carga,
        fec_proceso,
        num_tarjeta,
        cod_tarjeta,
        txt_descripcion,
        fec_estampacion,
        cid_turno,
        cid_tamanio,
        cid_tipo_soli,
        cid_tipo_arch,
        cod_oficina,
        cid_tipo_docu,
        cid_num_docu,
        cod_material,
        fec_coordinacion,
        cid_st_tarjeta,
        cid_form_fact,
        'ADMIN',
        SYSDATE,
        cid_tecnologia 
    
    FROM TARGPS.ttargps_archivo_solicitado_tmp;
  
    commit;
    
  END PR_CARGAR_TARJETAS;
  
  PROCEDURE PR_ACTUALIZAR_TARJ_SOLI(IN_ST_TARJETA VARCHAR2)
  IS
    TYPE MATRIZ_ROWID IS TABLE OF ROWID;
    TYPE MATRIZ_REFERENCIA IS TABLE OF TARGPS.TTARGPS_TARJETA.CID_REFERENCIA%TYPE;
    
    M_ROWID MATRIZ_ROWID;
    M_REFERENCIA MATRIZ_REFERENCIA;
    
    CURSOR C_TARJETAS IS
     SELECT
         ast.rowid,
         art.cod_referencia
      FROM TARGPS.TTARGPS_TARJETA AST,
           TARGPS.TTARGPS_ARCHIVO_RETORNADO_TMP ART
      WHERE AST.NUM_TARJETA = ART.NUM_TARJETA
        AND AST.NID_PROCESO_CARGA = ART.NID_PROCESO_CARGA
        AND AST.CID_TURNO = ART.CID_TURNO
        AND TO_CHAR(AST.FEC_PROCESO,'DD/MM/YYYY') = TO_CHAR(ART.FEC_PROCESO,'DD/MM/YYYY')
      ;
    
  BEGIN
      OPEN C_TARJETAS;
            LOOP
             FETCH C_TARJETAS BULK COLLECT
               INTO M_ROWID, M_REFERENCIA LIMIT 200;
  
             FORALL I IN 1 .. M_ROWID.COUNT
               UPDATE TARGPS.TTARGPS_TARJETA
                 SET CID_REFERENCIA = M_REFERENCIA(I),
                     CID_ST_TARJETA = IN_ST_TARJETA
                 WHERE ROWID = M_ROWID(I);
             COMMIt;
             EXIT WHEN C_TARJETAS%NOTFOUND;
            END LOOP;
      CLOSE C_TARJETAS;
  
    commit;
    
  END PR_ACTUALIZAR_TARJ_SOLI;
  
  PROCEDURE PR_ACTUALIZAR_TARJ_RETO(IN_ST_TARJETA VARCHAR2)
  IS
    TYPE MATRIZ_ROWID IS TABLE OF ROWID;
    TYPE MATRIZ_ESTADO IS TABLE OF TARGPS.TTARGPS_TARJETA.CID_ST_TARJETA%TYPE;
    
    M_ROWID MATRIZ_ROWID;
    M_ESTADO MATRIZ_ESTADO;
    
    CURSOR C_TARJETAS IS
     SELECT
         AST.rowid,
         AF.cid_ESTADO
      FROM TARGPS.TTARGPS_TARJETA AST,
           TARGPS.TTARGPS_ARCHIVO_FALTANTE_TMP AF
      WHERE AST.CID_REFERENCIA = AF.COD_REFERENCIA
        AND AST.CID_TURNO = AF.CID_TURNO
        AND TO_CHAR(AST.FEC_PROCESO,'DD/MM/YYYY') = TO_CHAR(AF.FEC_PROCESO,'DD/MM/YYYY')
      ;
    
  BEGIN
      OPEN C_TARJETAS;
            LOOP
             FETCH C_TARJETAS BULK COLLECT
               INTO M_ROWID, M_ESTADO LIMIT 200;
  
             FORALL I IN 1 .. M_ROWID.COUNT
               UPDATE TARGPS.TTARGPS_TARJETA
                 SET CID_ST_TARJETA = IN_ST_TARJETA
                 WHERE ROWID = M_ROWID(I);
             COMMIt;
             EXIT WHEN C_TARJETAS%NOTFOUND;
            END LOOP;
      CLOSE C_TARJETAS;
  
    commit;
    
  END PR_ACTUALIZAR_TARJ_RETO;
  
  PROCEDURE PR_ARCHIVO_SOLICITADOS(IN_CODIDO_PROCESO IN NUMBER,
                                   IN_FECHA_PROCESO IN VARCHAR2,
                                   IN_NOMBRE_ARCHIVO IN VARCHAR2,
                                   OUT_RETORNO OUT NUMBER,
                                   OUT_MENSAJE OUT VARCHAR2)
  IS
    errores NUMBER;
    dml_errores EXCEPTION;
    contador_errores number := 0;
    PRAGMA exception_init(dml_errores, -24381);
  
  CURSOR C_SOLICITADOS IS
   SELECT
      	num_tarjeta,
        cod_tarjeta,
        '' txt_descripcion,
        fec_proceso fec_estampacion,
        ind_turno cid_turno,
        ind_tamanio cid_tamanio,
        ind_solicitud cid_tipo_soli,
        '' cid_tipo_arch,
        cod_oficina cod_oficina,
        cod_tipo_docu cid_tipo_docu,
        num_docu cid_num_docu,
        '' cod_material,
        '' fec_coordinacion,
        '' cid_st_tarjeta,
        '' cid_form_fact,
        ind_chip cid_tecnologia
        
    FROM TARGPS.TTARGPS_ARCHIVO_SOLICITADO_EXT;
  
  
  TYPE SOLICITADOS IS RECORD(
                num_tarjeta  VARCHAR2(20),
                cod_tarjeta  VARCHAR2(4),
                txt_descripcion  VARCHAR2(50),
                fec_estampacion  VARCHAR2(10),
                cid_turno  VARCHAR2(2),
                cid_tamanio  VARCHAR2(2),
                cid_tipo_soli  VARCHAR2(2),
                cid_tipo_arch  VARCHAR2(2),
                cod_oficina  VARCHAR2(4),
                cid_tipo_docu  VARCHAR2(2),
                cid_num_docu  VARCHAR2(11),
                cod_material  VARCHAR2(9),
                fec_coordinacion  VARCHAR2(10),
                cid_st_tarjeta  VARCHAR2(2),
                cid_form_fact  VARCHAR2(2),
                cid_tecnologia  VARCHAR2(2)
  );
  
  TYPE T_SOLICITADOS IS TABLE OF SOLICITADOS;
  
  V_SOLICITADOS T_SOLICITADOS;
  
  V_ERR_MSG VARCHAR2(500);
  V_ERROR  VARCHAR2(500);
  V_NOMBRE_TABLA_EXT VARCHAR2(100):='TTARGPS_ARCHIVO_SOLICITADO_EXT';
  
  p_OUT_RETORNO_DC  NUMBER;
  p_OUT_MENSAJE_DC  VARCHAR2(500);
  V_FILA NUMBER;
  V_COD_IDENTIFICADOR VARCHAR2(20);
  
  p_OUT_RETORNOPROC NUMBER;
  p_OUT_MENSAJEPROC VARCHAR2(500);
  V_REG_LEIDOS NUMBER;
  
  OUT_SALIDA  NUMBER;
  OUT_ESTADO VARCHAR2(2);
  
  BEGIN
    OUT_RETORNO :=-1;
    OUT_SALIDA  :=-1;
    p_OUT_RETORNO_DC:=-1;
    p_OUT_RETORNOPROC:=-1;
    V_REG_LEIDOS:=0;
  
 -- EXECUTE IMMEDIATE 'ALTER TABLE  CONADE.TCONADE_COBSALDETA_TMP DISABLE CONSTRAINT XPKTCONADE_COBSALDETA_TMP ' ;
  
    PR_REUBICAR_TABLA_EXT (V_NOMBRE_TABLA_EXT ,IN_NOMBRE_ARCHIVO,OUT_SALIDA );
  
    IF OUT_SALIDA=1 THEN
  
      EXECUTE IMMEDIATE 'TRUNCATE TABLE TARGPS.TTARGPS_ARCHIVO_SOLICITADO_TMP ' ;
  
  
      OPEN C_SOLICITADOS;
      LOOP
        EXIT WHEN C_SOLICITADOS%NOTFOUND;
        FETCH C_SOLICITADOS BULK COLLECT INTO V_SOLICITADOS  LIMIT 200;
  
            BEGIN
            V_REG_LEIDOS:= V_REG_LEIDOS + V_SOLICITADOS.COUNT;
            FORALL i IN 1..V_SOLICITADOS.COUNT SAVE EXCEPTIONS
                  INSERT INTO TARGPS.TTARGPS_ARCHIVO_SOLICITADO_TMP VALUES(
                    IN_CODIDO_PROCESO,
                    TRIM(V_SOLICITADOS(i).num_tarjeta),
                    TRIM(V_SOLICITADOS(i).cod_tarjeta),
                    TRIM(V_SOLICITADOS(i).txt_descripcion),
                    TO_DATE(TRIM(V_SOLICITADOS(i).fec_estampacion),'DDMMYYYY'),
                    TRIM(V_SOLICITADOS(i).cid_turno),
                    TRIM(V_SOLICITADOS(i).cid_tamanio),
                    TRIM(V_SOLICITADOS(i).cid_tipo_soli),
                    TRIM(V_SOLICITADOS(i).cid_tipo_arch),
                    TRIM(V_SOLICITADOS(i).cod_oficina),
                    TRIM(V_SOLICITADOS(i).cid_tipo_docu),
                    TRIM(V_SOLICITADOS(i).cid_num_docu),
                    TRIM(V_SOLICITADOS(i).cod_material),
                    TO_DATE(TRIM(V_SOLICITADOS(i).fec_coordinacion),'DDMMYYYY'),
                    TRIM(V_SOLICITADOS(i).cid_st_tarjeta),
                    TRIM(V_SOLICITADOS(i).cid_form_fact),
                    TRIM(V_SOLICITADOS(i).cid_tecnologia),
                    TO_DATE(IN_FECHA_PROCESO,'DD/MM/YYYY')
                  );
              EXCEPTION
              WHEN dml_errores THEN
              errores := SQL%BULK_EXCEPTIONS.COUNT;
              contador_errores := contador_errores + errores;
                FOR i IN 1..errores LOOP
                  /*V_ERROR:='Error: ' || i ||
                  ' Array Index: ' || SQL%BULK_EXCEPTIONS(i).error_index ||
                  ' Message: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE); */
  
                   V_FILA:=TO_NUMBER(SQL%BULK_EXCEPTIONS(i).error_index) ;
                   V_COD_IDENTIFICADOR:=to_char(V_SOLICITADOS(SQL%BULK_EXCEPTIONS(i).ERROR_INDEX ).num_tarjeta);
                   V_ERROR:='Error: ' || i ||
                  ' Fila: ' || SQL%BULK_EXCEPTIONS(i).error_index ||
                  ' Error: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE);
  
                  PR_LOG_CARGA(
                    IN_CODIDO_PROCESO,
                    IN_NOMBRE_ARCHIVO,
                    V_FILA ,
                    V_COD_IDENTIFICADOR ,
                    V_ERROR ,
                    p_OUT_RETORNO_DC ,
                    p_OUT_MENSAJE_DC
                    );
  
                END LOOP;
            END;
    END LOOP;
   CLOSE C_SOLICITADOS;
   COMMIT;
  
   IF contador_errores=0 THEN
         OUT_ESTADO := '78';--EXITO
         OUT_MENSAJE:='EXITO::CARGA COMPLETA.';
         OUT_RETORNO := 1;
     ELSE
         OUT_ESTADO := '79';--ERROR
         OUT_RETORNO:=-1;
         OUT_MENSAJE:='ERROR::CARGA INCOMPLETA.';
    END IF;
    UPDATE targps.ttargps_archivo arch
    set arch.estado_carga = OUT_ESTADO, 
        arch.fec_carga_fin = sysdate
    WHERE arch.cid_tipo = '58' -- Estampado
    and arch.nid_proceso_carga = IN_CODIDO_PROCESO;
    commit;
  ELSE
   OUT_RETORNO:=-1;
   OUT_MENSAJE:='ERROR EN REUBICACION DE TABLA EXTERNA';
  END IF;
  --EXECUTE immediate 'ALTER TABLE  CONADE.TCONADE_COBSALDETA_TMP ENABLE CONSTRAINT XPKTCONADE_COBSALDETA_TMP ' ;
  EXCEPTION

  WHEN OTHERS THEN
  
      OUT_RETORNO:=-1;
      V_ERR_MSG :=SQLERRM;
      OUT_MENSAJE:='ERROR EN CARGA DE SOLICITADOS, ERROR ' || V_ERR_MSG;
  
  END PR_ARCHIVO_SOLICITADOS;
  
  PROCEDURE PR_ARCHIVO_RETORNADOS(IN_CODIDO_PROCESO IN NUMBER,
                                   IN_FECHA_PROCESO IN VARCHAR2,
                                   IN_NOMBRE_ARCHIVO IN VARCHAR2,
                                   IN_TURNO IN VARCHAR2,
                                   OUT_RETORNO OUT NUMBER,
                                   OUT_MENSAJE OUT VARCHAR2)
  IS
    errores NUMBER;
    dml_errores EXCEPTION;
    contador_errores number := 0;
    PRAGMA exception_init(dml_errores, -24381);
  
  CURSOR C_RETORNADOS IS
   SELECT
      	num_tarjeta,
        cod_tarjeta,
        cid_solicitud,
        cid_tamanio,
        cid_tecnologia,
        fec_proceso,
        cod_oficina,
        num_ruc,
        cod_tipo_docu,
        num_docu,
        cod_ubigeo,
        cod_referencia,
        cod_courier      
    FROM TARGPS.TTARGPS_ARCHIVO_RETORNADO_EXT;
  
  
  TYPE RETORNADOS IS RECORD(
                num_tarjeta  VARCHAR2(20),
                cod_tarjeta  VARCHAR2(4),
                cid_solicitud  VARCHAR2(1),
                cid_tamanio  VARCHAR2(1),
                cid_tecnologia VARCHAR2(1),
                fec_proceso VARCHAR2(10),
                cod_oficina  VARCHAR2(4),
                num_ruc  VARCHAR2(11),
                cod_tipo_docu  VARCHAR2(1),
                num_docu  VARCHAR2(11),
                cod_ubigeo  VARCHAR2(6),
                cod_referencia  VARCHAR2(6),
                cod_courier  VARCHAR2(2)
  );
  
  TYPE T_RETORNADOS IS TABLE OF RETORNADOS;
  
  V_RETORNADOS T_RETORNADOS;
  
  V_ERR_MSG VARCHAR2(500);
  V_ERROR  VARCHAR2(500);
  V_NOMBRE_TABLA_EXT VARCHAR2(100):='TTARGPS_ARCHIVO_RETORNADO_EXT';
  
  p_OUT_RETORNO_DC  NUMBER;
  p_OUT_MENSAJE_DC  VARCHAR2(500);
  V_FILA NUMBER;
  V_COD_IDENTIFICADOR VARCHAR2(20);
  
  p_OUT_RETORNOPROC NUMBER;
  p_OUT_MENSAJEPROC VARCHAR2(500);
  V_REG_LEIDOS NUMBER;
  
  OUT_SALIDA  NUMBER;
  OUT_ESTADO VARCHAR2(2);
  BEGIN
    OUT_RETORNO :=-1;
    OUT_SALIDA  :=-1;
    p_OUT_RETORNO_DC:=-1;
    p_OUT_RETORNOPROC:=-1;
    V_REG_LEIDOS:=0;
  
 -- EXECUTE IMMEDIATE 'ALTER TABLE  CONADE.TCONADE_COBSALDETA_TMP DISABLE CONSTRAINT XPKTCONADE_COBSALDETA_TMP ' ;
  
    PR_REUBICAR_TABLA_EXT (V_NOMBRE_TABLA_EXT ,IN_NOMBRE_ARCHIVO,OUT_SALIDA );
  
    IF OUT_SALIDA=1 THEN
  
      EXECUTE IMMEDIATE 'TRUNCATE TABLE TARGPS.TTARGPS_ARCHIVO_RETORNADO_TMP ' ;
  
  
      OPEN C_RETORNADOS;
      LOOP
        EXIT WHEN C_RETORNADOS%NOTFOUND;
        FETCH C_RETORNADOS BULK COLLECT INTO V_RETORNADOS  LIMIT 200;
  
            BEGIN
            V_REG_LEIDOS:= V_REG_LEIDOS + V_RETORNADOS.COUNT;
            FORALL i IN 1..V_RETORNADOS.COUNT SAVE EXCEPTIONS
                  INSERT INTO TARGPS.TTARGPS_ARCHIVO_RETORNADO_TMP VALUES(
                    IN_CODIDO_PROCESO,
                    TRIM(V_RETORNADOS(i).num_tarjeta),
                    TRIM(V_RETORNADOS(i).cod_tarjeta),
                    TRIM(V_RETORNADOS(i).cid_solicitud),
                    TRIM(V_RETORNADOS(i).cid_tamanio),
                    TRIM(V_RETORNADOS(i).cid_tecnologia),
                    TRIM(V_RETORNADOS(i).cod_oficina),
                    TRIM(V_RETORNADOS(i).num_ruc),
                    TRIM(V_RETORNADOS(i).cod_tipo_docu),
                    TRIM(V_RETORNADOS(i).num_docu),
                    TRIM(V_RETORNADOS(i).cod_ubigeo),
                    TRIM(V_RETORNADOS(i).cod_referencia),
                    TRIM(V_RETORNADOS(i).cod_courier),
                    TO_DATE(TRIM(V_RETORNADOS(i).fec_proceso),'DDMMYYYY'),
                    IN_TURNO
                  );
              EXCEPTION
              WHEN dml_errores THEN
              errores := SQL%BULK_EXCEPTIONS.COUNT;
              contador_errores := contador_errores + errores;
                FOR i IN 1..errores LOOP
                  /*V_ERROR:='Error: ' || i ||
                  ' Array Index: ' || SQL%BULK_EXCEPTIONS(i).error_index ||
                  ' Message: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE); */
  
                   V_FILA:=TO_NUMBER(SQL%BULK_EXCEPTIONS(i).error_index) ;
                   V_COD_IDENTIFICADOR:=to_char(V_RETORNADOS(SQL%BULK_EXCEPTIONS(i).ERROR_INDEX ).cod_referencia);
                   V_ERROR:='Error: ' || i ||
                  ' Fila: ' || SQL%BULK_EXCEPTIONS(i).error_index ||
                  ' Error: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE);
  
                  PR_LOG_CARGA(
                    IN_CODIDO_PROCESO,
                    IN_NOMBRE_ARCHIVO,
                    V_FILA ,
                    V_COD_IDENTIFICADOR ,
                    V_ERROR ,
                    p_OUT_RETORNO_DC ,
                    p_OUT_MENSAJE_DC
                    );
  
                END LOOP;
            END;
    END LOOP;
   CLOSE C_RETORNADOS;
   COMMIT;
  
   IF contador_errores=0 THEN
         OUT_ESTADO := '78';--EXITO
         OUT_MENSAJE:='EXITO::CARGA COMPLETA.';
         OUT_RETORNO := 1;
     ELSE
         OUT_ESTADO := '79';--ERROR
         OUT_RETORNO:=-1;
         OUT_MENSAJE:='ERROR::CARGA INCOMPLETA.';
    END IF;
    UPDATE targps.ttargps_archivo arch
    set arch.estado_carga = OUT_ESTADO, 
        arch.fec_carga_fin = sysdate
    WHERE arch.cid_tipo = '59' -- Retorno
    and arch.nid_proceso_carga = IN_CODIDO_PROCESO;
    commit;
  
  ELSE
   OUT_RETORNO:=-1;
   OUT_MENSAJE:='ERROR EN REUBICACION DE TABLA EXTERNA';
  END IF;
  --EXECUTE immediate 'ALTER TABLE  CONADE.TCONADE_COBSALDETA_TMP ENABLE CONSTRAINT XPKTCONADE_COBSALDETA_TMP ' ;
  EXCEPTION

  WHEN OTHERS THEN
  
      OUT_RETORNO:=-1;
      V_ERR_MSG :=SQLERRM;
      OUT_MENSAJE:='ERROR EN CARGA DE SOLICITADOS, ERROR ' || V_ERR_MSG;
  
  END PR_ARCHIVO_RETORNADOS;
  
  
  PROCEDURE PR_ARCHIVO_FALTANTES(IN_CODIDO_PROCESO IN NUMBER,
                                   IN_FECHA_PROCESO IN VARCHAR2,
                                   IN_NOMBRE_ARCHIVO IN VARCHAR2,
                                   IN_TURNO IN VARCHAR2,
                                   OUT_RETORNO OUT NUMBER,
                                   OUT_MENSAJE OUT VARCHAR2)
  IS
    errores NUMBER;
    dml_errores EXCEPTION;
    contador_errores number := 0;
    PRAGMA exception_init(dml_errores, -24381);
  
  CURSOR C_FALTANTES IS
   SELECT
      	num_tarjeta,
        cod_tarjeta,
        cid_solicitud,
        cid_tamanio,
        cid_tecnologia,
        fec_proceso,
        cod_oficina,
        num_ruc,
        cod_tipo_docu,
        num_docu,
        cod_ubigeo,
        cod_referencia,
        cod_courier,
        cod_estado
    FROM TARGPS.TTARGPS_ARCHIVO_FALTANTE_EXT;
  
  
  TYPE FALTANTES IS RECORD(
                num_tarjeta  VARCHAR2(20),
                cod_tarjeta  VARCHAR2(4),
                cid_solicitud  VARCHAR2(1),
                cid_tamanio  VARCHAR2(1),
                cid_tecnologia VARCHAR2(1),
                fec_proceso VARCHAR2(10),
                cod_oficina  VARCHAR2(4),
                num_ruc  VARCHAR2(11),
                cod_tipo_docu  VARCHAR2(1),
                num_docu  VARCHAR2(11),
                cod_ubigeo  VARCHAR2(6),
                cod_referencia  VARCHAR2(6),
                cod_courier  VARCHAR2(2),
                cid_estado VARCHAR2(2)
  );
  
  TYPE T_FALTANTES IS TABLE OF FALTANTES;
  
  V_FALTANTES T_FALTANTES;
  
  V_ERR_MSG VARCHAR2(500);
  V_ERROR  VARCHAR2(500);
  V_NOMBRE_TABLA_EXT VARCHAR2(100):='TTARGPS_ARCHIVO_FALTANTE_EXT';
  
  p_OUT_RETORNO_DC  NUMBER;
  p_OUT_MENSAJE_DC  VARCHAR2(500);
  V_FILA NUMBER;
  V_COD_IDENTIFICADOR VARCHAR2(20);
  
  p_OUT_RETORNOPROC NUMBER;
  p_OUT_MENSAJEPROC VARCHAR2(500);
  V_REG_LEIDOS NUMBER;
  
  OUT_SALIDA  NUMBER;
  OUT_ESTADO VARCHAR2(2);
  BEGIN
    OUT_RETORNO :=-1;
    OUT_SALIDA  :=-1;
    p_OUT_RETORNO_DC:=-1;
    p_OUT_RETORNOPROC:=-1;
    V_REG_LEIDOS:=0;
  
 -- EXECUTE IMMEDIATE 'ALTER TABLE  CONADE.TCONADE_COBSALDETA_TMP DISABLE CONSTRAINT XPKTCONADE_COBSALDETA_TMP ' ;
  
    PR_REUBICAR_TABLA_EXT (V_NOMBRE_TABLA_EXT ,IN_NOMBRE_ARCHIVO,OUT_SALIDA );
  
    IF OUT_SALIDA=1 THEN
  
      EXECUTE IMMEDIATE 'TRUNCATE TABLE TARGPS.TTARGPS_ARCHIVO_FALTANTE_TMP ' ;
  
  
      OPEN C_FALTANTES;
      LOOP
        EXIT WHEN C_FALTANTES%NOTFOUND;
        FETCH C_FALTANTES BULK COLLECT INTO V_FALTANTES  LIMIT 200;
  
            BEGIN
            V_REG_LEIDOS:= V_REG_LEIDOS + V_FALTANTES.COUNT;
            FORALL i IN 1..V_FALTANTES.COUNT SAVE EXCEPTIONS
                  INSERT INTO TARGPS.TTARGPS_ARCHIVO_FALTANTE_TMP VALUES(
                    IN_CODIDO_PROCESO,
                    TRIM(V_FALTANTES(i).num_tarjeta),
                    TRIM(V_FALTANTES(i).cod_tarjeta),
                    TRIM(V_FALTANTES(i).cid_solicitud),
                    TRIM(V_FALTANTES(i).cid_tamanio),
                    TRIM(V_FALTANTES(i).cid_tecnologia),
                    TRIM(V_FALTANTES(i).cod_oficina),
                    TRIM(V_FALTANTES(i).num_ruc),
                    TRIM(V_FALTANTES(i).cod_tipo_docu),
                    TRIM(V_FALTANTES(i).num_docu),
                    TRIM(V_FALTANTES(i).cod_ubigeo),
                    TRIM(V_FALTANTES(i).cod_referencia),
                    TRIM(V_FALTANTES(i).cod_courier),
                    TO_DATE(TRIM(V_FALTANTES(i).fec_proceso),'DDMMYYYY'),
                    IN_TURNO,
                    TRIM(V_FALTANTES(i).cid_estado)
                  );
              EXCEPTION
              WHEN dml_errores THEN
              errores := SQL%BULK_EXCEPTIONS.COUNT;
              contador_errores := contador_errores + errores;
                FOR i IN 1..errores LOOP
                  /*V_ERROR:='Error: ' || i ||
                  ' Array Index: ' || SQL%BULK_EXCEPTIONS(i).error_index ||
                  ' Message: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE); */
  
                   V_FILA:=TO_NUMBER(SQL%BULK_EXCEPTIONS(i).error_index) ;
                   V_COD_IDENTIFICADOR:=to_char(V_FALTANTES(SQL%BULK_EXCEPTIONS(i).ERROR_INDEX ).cod_referencia);
                   V_ERROR:='Error: ' || i ||
                  ' Fila: ' || SQL%BULK_EXCEPTIONS(i).error_index ||
                  ' Error: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE);
  
                  PR_LOG_CARGA(
                    IN_CODIDO_PROCESO,
                    IN_NOMBRE_ARCHIVO,
                    V_FILA ,
                    V_COD_IDENTIFICADOR ,
                    V_ERROR ,
                    p_OUT_RETORNO_DC ,
                    p_OUT_MENSAJE_DC
                    );
  
                END LOOP;
            END;
    END LOOP;
   CLOSE C_FALTANTES;
   COMMIT;
  
    IF contador_errores=0 THEN
         OUT_ESTADO := '78';--EXITO
         OUT_MENSAJE:='EXITO::CARGA COMPLETA.';
         OUT_RETORNO := 1;
     ELSE
         OUT_ESTADO := '79';--ERROR
         OUT_RETORNO:=-1;
         OUT_MENSAJE:='ERROR::CARGA INCOMPLETA.';
    END IF;
    UPDATE targps.ttargps_archivo arch
    set arch.estado_carga = OUT_ESTADO, 
        arch.fec_carga_fin = sysdate
    WHERE arch.cid_tipo = '60' --Faltante
    and arch.nid_proceso_carga = IN_CODIDO_PROCESO;
    commit;
  
  ELSE
   OUT_RETORNO:=-1;
   OUT_MENSAJE:='ERROR EN REUBICACION DE TABLA EXTERNA';
  END IF;
  --EXECUTE immediate 'ALTER TABLE  CONADE.TCONADE_COBSALDETA_TMP ENABLE CONSTRAINT XPKTCONADE_COBSALDETA_TMP ' ;
  EXCEPTION

  WHEN OTHERS THEN
  
      OUT_RETORNO:=-1;
      V_ERR_MSG :=SQLERRM;
      OUT_MENSAJE:='ERROR EN CARGA DE SOLICITADOS, ERROR ' || V_ERR_MSG;
  
  END PR_ARCHIVO_FALTANTES;
  
  PROCEDURE PR_LOG_CARGA
  (
    p_IN_IDPROCESO IN NUMBER,
    p_IN_NOMBREARCHIVO IN VARCHAR2,
    p_IN_FILA NUMBER,
    p_COD_IDENTIFICADOR IN VARCHAR2,
    p_MSGERROR IN VARCHAR2,
    p_OUT_RETORNO OUT NUMBER,
    p_OUT_MENSAJE OUT VARCHAR2
  )
  iS
   V_ERR_MSG VARCHAR2(500);
  BEGIN
  
        INSERT INTO TARGPS.TTARGPS_LOG_CARGA
        ( id_log_carga,
          id_proceso,
          nombre_archivo,
          fila,
          identificador,
          mensaje_error,
          cod_usuario_creacion,
          fecha_creacion,
          estado
        )VALUES(
          TARGPS.SEQ_TTARGPS_LOG_CARGA.NEXTVAL,
          p_IN_IDPROCESO ,
          p_IN_NOMBREARCHIVO,
          p_IN_FILA ,
          p_COD_IDENTIFICADOR ,
          p_MSGERROR ,
          'ADMIN',
          SYSDATE,
          1 
        ) ;
     COMMIT;
     p_OUT_RETORNO:=1;
   EXCEPTION
   WHEN OTHERS THEN
        ROLLBACK;
        p_OUT_RETORNO:=-1;
        V_ERR_MSG :=SQLERRM;
        p_OUT_MENSAJE:='ERROR EN INSERT DEL LOG CARGA, ERROR ' || V_ERR_MSG;
  
  END PR_LOG_CARGA;
  
  
  
  PROCEDURE PR_VALIDAR_ENPROCESO(
    PIDAUTORIZA OUT  VARCHAR2
    )AS
    VCOUNT INTEGER;
    BEGIN
      VCOUNT:=0;
    
        BEGIN
        SELECT COUNT(1) INTO VCOUNT
        FROM targps.ttargps_parametro
        WHERE valor='1'
        AND id_parametro=4;
        exception
         when NO_DATA_FOUND then
           VCOUNT:=0;
         when others then
           VCOUNT:=0;
         end;
       IF VCOUNT=0 THEN
          UPDATE targps.ttargps_parametro
          SET valor='1'
          WHERE  id_parametro=4;
         commit;
         PIDAUTORIZA:='1';
        ELSE
         PIDAUTORIZA:='0';
       END IF;
    
    
      EXCEPTION
       WHEN OTHERS THEN
            PIDAUTORIZA:='0';
    
    END PR_VALIDAR_ENPROCESO;
    
    PROCEDURE PR_CONSOLIDAR_CARGA(idTurno Varchar2, fechaProceso Varchar2, cur_equipos out sys_refcursor)
    IS
    BEGIN
      NULL;
    END;

END PKG_TARGPS;
/
